// 时间日期问题
#include <stdio.h>

/// @brief 判断某一年是否是闰年
/// @param year 传入年份
/// @return 是否闰年
int isLeapYear(int year)
{
	// 闰年：年份能够被400整除或者能够被4整除且不能被100整除
	return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

/// @brief 计算某个日期在当年是第几天，例如2022.1.2是当年的第2天
/// @param year 年份
/// @param month 月份
/// @param day 日期
/// @return 当年第几天
int dayInYear(int year, int month, int day)
{
	int count = 0, i;
	// 全部月份
	int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	// 先累加月份天数，累加至目标月份前一月
	for (i = 1; i < month; i++)
	{
		count += months[i - 1];
	}
	// 判断闰年
	if (month > 2 && isLeapYear(year))
	{
		count++;
	}
	// 最后累加天数
	count += day;
	return count;
}

/// @brief 传入两个日期的相距的天数，例如2022.11.1到2022.11.2相距1天
/// @param startYear 起始年份
/// @param startMonth 起始月份
/// @param startDay 起始日期
/// @param endYear 终止年份
/// @param endMonth 终止月份
/// @param endDay 终止日期
/// @return 相距天数
int distanceDay(int startYear, int startMonth, int startDay, int endYear, int endMonth, int endDay)
{
	if (startYear > endYear || startMonth > endMonth || startDay > endDay)
	{
		// 错误
		return -1;
	}
	int i, count = 0;
	// 先从startYear开始到endYear - 1累加年份
	for (i = startYear; i < endYear; i++)
	{
		count += isLeapYear(i) ? 366 : 365;
	}
	// 再累加终止年的天数
	count += dayInYear(endYear, endMonth, endDay);
	// 这个时候得到了起始年的1月1日到终止日期的天数，最后减去起始日期在起始年的天数即可
	count -= dayInYear(startYear, startMonth, startDay);
	return count;
}

int main()
{
	printf("%d\n", distanceDay(2022, 11, 1, 2022, 11, 2));
	return 0;
}